package com.android.clinic.app.utils;

import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;

import com.android.clinic.app.ClinicApplication;

import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by cheng on 2018/1/26.
 */
public class Utils {

    public static long lastClickTime = 0;
    private static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

    public static int getScreenWidth() {
        return ClinicApplication.getInstance().getResources().getDisplayMetrics().widthPixels;
    }

    public static int getScreenHeight() {
        return ClinicApplication.getInstance().getResources().getDisplayMetrics().heightPixels;
    }

    /**
     * 防止连续点击跳转两个页面
     */
    public static boolean isFastClick() {
        long time = System.currentTimeMillis();
        if (time - lastClickTime < 500) {
            return true;
        }
        lastClickTime = time;
        return false;
    }

    /**
     * 保存字段
     *
     * @param ctx
     * @param title
     * @param key
     * @param value
     */
    public static void saveToSP(Context ctx, String title, String key, String value) {
        SharedPreferences.Editor se = ctx.getSharedPreferences(title, Context.MODE_PRIVATE).edit();
        se.putString(key, value);
        se.commit();
    }

    /**
     * 读出字段
     *
     * @param ctx
     * @param title
     * @param key
     * @return String 如果未保存则返回null
     */
    public static String getFromSP(Context ctx, String title, String key) {
        String value = "";
        try {
            SharedPreferences se = ctx.getSharedPreferences(title, Context.MODE_PRIVATE);
            if (se == null) {
                return "";
            }
            value = se.getString(key, "");
            if (value.equals("")) {
                return "";
            } else {
                return value;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return value;
    }

    // 推荐使用 保留文件夹
    public static void getAllFiles(File root) {
        File files[] = root.listFiles();
        if (files != null) {
            for (File f : files) {
                if (f.isDirectory()) {
                    getAllFiles(f);
                } else {
                    String fileName = f.getName().toLowerCase();
                    if (fileName.endsWith(".jpeg") || fileName.endsWith(".jpg") || fileName.endsWith(".png")
                            || fileName.endsWith(".gif") || fileName.endsWith(".apk")) {
                        f.delete();
                    }
                }
            }
        }
    }

    /**
     * 判断 一个字段的值否为空
     *
     * @param s
     * @return
     * @author Michael.Zhang 2013-9-7 下午4:39:00
     */
    public static boolean isEmpty(String s) {
        if (null == s || s.equals("") || s.equalsIgnoreCase("null")) {
            return true;
        }
        return false;
    }

    /**
     * @param phone
     * @return
     */
    public static boolean matchPhone(CharSequence phone) {
        Matcher m = Patterns.MOBILE_PHONE.matcher(phone);
        return m.matches();
    }

    /**
     * 时间戳转换成字符串
     *
     * @param time
     * @return
     */
    public static String getFormatTime(String time) {
        Date d = new Date(Long.parseLong(time));
        return sf.format(d);
    }

    /**
     * 获取系统当前时间
     * @return
     */
    public static String getCurrentTime() {
        return format.format(new Date());
    }

    /**
     * 比较两个日期的大小
     * @param dueTime
     * @return 前者比后者大返回true，否则为false
     */
    public static boolean compareToDate(String dueTime) {
        try {
            Date currentDate = format.parse(getCurrentTime());
            Date dueDate = format.parse(format.format(new Date(Long.parseLong(dueTime))));
            return currentDate.after(dueDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 校验身份证
     *
     * @param IDStr
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static String IDCardValidate(String IDStr) {
        String errorInfo = "";// 记录错误信息
        String[] ValCodeArr = {"1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2"};
        String[] Wi = {"7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"};
        String Ai = "";

        if (IDStr.length() != 18) {
            errorInfo = "身份证号码长度应该为 18位!";
            return errorInfo;
        }

        if (IDStr.length() == 18) {
            Ai = IDStr.substring(0, 17);
        } else if (IDStr.length() == 15) {
            Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15);
        }
        if (isNumeric(Ai) == false) {
            errorInfo = "18位身份证号码除最后一位外,都应为数字!";
            return errorInfo;
        }

        String strYear = Ai.substring(6, 10);// 年份
        String strMonth = Ai.substring(10, 12);// 月份
        String strDay = Ai.substring(12, 14);// 月份
        if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {
            errorInfo = "身份证生日无效!";
            return errorInfo;
        }
        GregorianCalendar gc = new GregorianCalendar();
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
        try {
            if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150
                    || (gc.getTime().getTime() - s.parse(strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {
                errorInfo = "身份证生日不在有效范围!";
                return errorInfo;
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (java.text.ParseException e) {
            e.printStackTrace();
        }
        if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
            errorInfo = "身份证月份无效!";
            return errorInfo;
        }
        if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {
            errorInfo = "身份证日期无效!";
            return errorInfo;
        }

        Hashtable h = GetAreaCode();
        if (h.get(Ai.substring(0, 2)) == null) {
            errorInfo = "身份证地区编码错误!";
            return errorInfo;
        }

        int totalAiWi = 0;
        for (int i = 0; i < 17; i++) {
            totalAiWi = totalAiWi + Integer.parseInt(String.valueOf(Ai.charAt(i))) * Integer.parseInt(Wi[i]);
        }
        int modValue = totalAiWi % 11;
        String strVerifyCode = ValCodeArr[modValue];
        Ai = Ai + strVerifyCode;

        if (IDStr.length() == 18) {
            if (Ai.equals(IDStr) == false) {
                errorInfo = "身份证无效, 不是合法的身份证号码!";
                return errorInfo;
            }
        } else {
            return "";
        }
        return "";
    }

    /**
     * 功能：设置地区编码
     *
     * @return Hashtable 对象
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    private static Hashtable GetAreaCode() {
        Hashtable hashtable = new Hashtable();
        hashtable.put("11", "北京");
        hashtable.put("12", "天津");
        hashtable.put("13", "河北");
        hashtable.put("14", "山西");
        hashtable.put("15", "内蒙古");
        hashtable.put("21", "辽宁");
        hashtable.put("22", "吉林");
        hashtable.put("23", "黑龙江");
        hashtable.put("31", "上海");
        hashtable.put("32", "江苏");
        hashtable.put("33", "浙江");
        hashtable.put("34", "安徽");
        hashtable.put("35", "福建");
        hashtable.put("36", "江西");
        hashtable.put("37", "山东");
        hashtable.put("41", "河南");
        hashtable.put("42", "湖北");
        hashtable.put("43", "湖南");
        hashtable.put("44", "广东");
        hashtable.put("45", "广西");
        hashtable.put("46", "海南");
        hashtable.put("50", "重庆");
        hashtable.put("51", "四川");
        hashtable.put("52", "贵州");
        hashtable.put("53", "云南");
        hashtable.put("54", "西藏");
        hashtable.put("61", "陕西");
        hashtable.put("62", "甘肃");
        hashtable.put("63", "青海");
        hashtable.put("64", "宁夏");
        hashtable.put("65", "新疆");
        hashtable.put("71", "台湾");
        hashtable.put("81", "香港");
        hashtable.put("82", "澳门");
        hashtable.put("91", "国外");
        return hashtable;
    }

    /**
     * 功能：判断字符串是否为日期格式
     *
     * @param
     * @return
     */
    public static boolean isDate(String strDate) {
        Pattern pattern = Pattern.compile(
                "^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$");
        Matcher m = pattern.matcher(strDate);
        if (m.matches()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * return true ,if the string is numeric
     *
     * @param str
     * @return
     */
    public static boolean isNumeric(final String str) {
        if (TextUtils.isEmpty(str)) {
            return false;
        }
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(str);
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }

    /**
     * 根据value值获取到对应的一个key值
     * @param map
     * @param value
     * @return
     */
    public static String getMapKey(HashMap<String, Integer> map, int value) {
        String key = null;
        for (String getKey : map.keySet()) {
            if (map.get(getKey) == value) {
                key = getKey;
            }
        }
        return key;
    }

    public static String getSubStringTitle(String title) {
        if (title.length() > 4) {
            return title.substring(0, 4) + "...";
        } else {
            return title;
        }

    }

}
